package com.zxlspace.collection2;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class TestNewClass {

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, IOException {
        Employee employee = new Employee();
        //使用Class类的newInstance方法创建对象。这个newInstance方法调用无参的构造函数创建对象。
        Employee e1 = (Employee) Class.forName(Employee.class.getName()).newInstance();
        Employee e2 = (Employee) Class.forName("com.zxlspace.collection2.Employee").newInstance();

        //和Class类的newInstance方法很像， java.lang.reflect.Constructor类里也有一个newInstance方法可以创建对象。
        //我们可以通过这个newInstance方法调用有参数的和私有的构造函数
        Constructor constructor = Employee.class.getDeclaredConstructor();
        Employee e3 = (Employee) constructor.newInstance();

        Employee e4 = Employee.class.newInstance();

        //无论何时我们调用一个对象的clone方法，jvm就会创建一个新的对象，将前面对象的内容全部拷贝进去。用clone方法创建对象并不会调用任何构造函数
        Employee employee1 = (Employee) e4.clone();

        // 当我们序列化和反序列化一个对象，jvm会给我们创建一个单独的对象。在反序列化时，jvm创建对象并不会调用任何构造函数
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("com.zxlspace.collection2.Employee"));
        Employee employee2 = (Employee) in.readObject();
    }
}
